<template>
  <div class="container">
    <van-nav-bar title="搜索中心" left-arrow @click-left="$router.back()" />
    <!-- 搜索输入框 -->
    <van-search
      v-model.trim="keyWord"
      placeholder="请输入搜索关键词"
      shape="round"
      @search="onSearch"
    />
    <!-- 联想搜索 -->
    <van-cell-group class="suggest-box" v-if="keyWord">
      <!-- span高亮联想关键词 -->
      <van-cell
        @click="
          $router.push({
            path: '/search/result',
            query: { q: sug.replace(`<span>${keyWord}</span>`, keyWord) },
          })
        "
        icon="search"
        v-for="sug in suggestList"
        :key="sug"
        ><p v-html="sug"></p
      ></van-cell>
    </van-cell-group>
    <!-- 历史记录 -->
    <div class="history-box" v-else-if="historyList">
      <div class="head">
        <span>历史记录</span>
        <van-icon name="delete" @click="delhistoryList"></van-icon>
      </div>
      <van-cell-group>
        <van-cell v-for="key in historyList" :key="key">
          <a class="word_btn" @click="goSearch(key)">{{ key }}</a>
          <van-icon
            @click="delHistory(key)"
            class="close_btn"
            slot="right-icon"
            name="cross"
          />
        </van-cell>
      </van-cell-group>
    </div>
  </div>
</template>

<script>
// 导入联想补全接口
import { suggestArticle } from '../../api/article'
/**
 * 处理历史记录显示
 *  1. 当用户输入之后把这个搜索记录存储到本地
 *  2. 页面刷新之后也不会消失
 * */
// 定义本地存储的key
const TT_SEARCH_HISTORY = 'TT_SEARCH_HISTORY'
// 测试本地存储数据
// localStorage.setItem(TT_SEARCH_HISTORY, JSON.stringify(['vue3.0', 'react 学习', '今日油条']))
export default {
  name: 'search-index',
  data () {
    return {
      keyWord: '', // 搜索框输入的搜索关键字
      // 定义本地存储数据
      historyList:
        JSON.parse(window.localStorage.getItem(TT_SEARCH_HISTORY)) || [],
      suggestList: [] // 联想补全列表
    }
  },
  // 监听器
  watch: {
    // 监听input框的输入变化
    keyWord () {
      // 函数防抖: 一段时间内，只执行一次，使用timeout定时器来监测
      // 判断如果当前有一个定时在运转那么就需要取消这个定时器
      this.timer && clearTimeout(this.timer)
      // 600ms 执行一次，当我下次触发的时候发现前面已经有一个定时器在运转，那么停止前面的定时器，只有在我输入完之后才会触发这个定时器
      this.timer = setTimeout(async () => {
        // console.log('联想补全触发了' + this.keyWord)
        // 判断如果当前输入框没有数据，那么return
        if (!this.keyWord) {
          this.suggestList = []
          return false
        }
        // 如果有数据调用ajax接口
        const { status, data } = await suggestArticle(this.keyWord)
        // console.log(status, data)
        if (status === 200) {
          this.suggestList = data.options.map((item) =>
            item.replace(this.keyWord, `<span>${this.keyWord}</span>`)
          )
          // console.log(this.suggestList)
        }
      }, 600)
    }
  },
  methods: {
    // 输入框发生改变触发的函数
    // 按回车触发
    onSearch (keyWord) {
      // console.log(keyWord)
      /**
       * 判断当前输入框是否有数据，如果没哟直接返回
       * 如果有数据，把当前数据存储到本地存储中
       * 携带当前的关键字跳转路由
       * */
      if (!keyWord) return false
      // 存储的key值不能重复，调用set方法  去重
      const historySet = new Set(this.historyList)
      // 把当前输入的值添加到historySet中
      historySet.add(keyWord)
      // 将去重之后的数据存储到本地数据中  set完成之后的数据需要结构之后转换成stringfy之后才可以存到本地中
      localStorage.setItem(TT_SEARCH_HISTORY, JSON.stringify([...historySet]))
      // 携带关键字跳转传参
      this.$router.push({ path: '/search/result', query: { q: keyWord } })
    },
    // 删除历史记录逻辑
    delHistory (key) {
      // 把历史记录从列表中删除
      this.historyList = this.historyList.filter((item) => item !== key)
      // 本地在把最新的数据添加到本地
      window.localStorage.setItem(
        TT_SEARCH_HISTORY,
        JSON.stringify(this.historyList)
      )
    },
    // 跳转到搜索结果页
    goSearch (key) {
      // 在跳转搜索结果页的同时需要给给传递一个query参数代表搜索关键词
      this.$router.push({ path: '/search/result', query: { q: key } })
    },
    // 垃圾桶图标，代表需要把所有的历史记录都删除，并且本地也要都删除
    delhistoryList () {
      // 把页面显示的历史记录数组设置为空
      this.historyList = []
      // 把本地存储设置为null
      window.localStorage.setItem(TT_SEARCH_HISTORY, null)
    }
  }
}
</script>

<style scoped lang='less'>
// 联想搜索
.suggest-box {
  /deep/ .van-cell {
    padding: 10px 20px;
    color: #999;
    p {
      span {
        color: red;
      }
    }
  }
}
// 历史记录
.history-box {
  padding: 0 20px;
  .head {
    line-height: 36px;
    color: #999;
    text-align: left;
    .van-icon {
      font-size: 16px;
      float: right;
      margin-top: 10px;
    }
  }
  .van-cell {
    padding: 10px 0;
  }
  .word_btn {
    color: #d43d3d;
  }
  .close_btn {
    margin-top: 5px;
    color: #999;
  }
}
</style>
